/*Copyright (C) 2009 - 2011 Careil Baptiste

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef TYPES_LIST_HEADER
#  define TYPES_LIST_HEADER

/*
** Définit la valeur d'une liste vide.
*/
# define EMPTY_LIST NULL

/*
** Définit la structure et le type de la liste.
*/

typedef struct structList {
	int data;

	struct structList *prev;

	struct structList *next;
} structList;

typedef structList *List;

/*
** Permet d'insérer un élément en fin de liste.
**
** \param list La liste où ajouter l'élément.
** \param data La valeur du nouvel élément.
*/
void List_PushBack(List *list, int data);

/*
** Permet d'insérer un élément en début de liste.
**
** \param list La liste où ajouter l'élément.
** \param data La valeur du nouvel élément.
*/
void List_PushUp(List *list, int data);

/*
** Permet d'insérer un élément dans la liste.
**
** \param list La liste où insérer l'élément.
** \param data La valeur du nouvel élément.
** \param index L'index du nouvel élément. Les autres éléments
** seront décalés si nécessaire. L'index commence à 0.
*/
void List_Insert(List *list, int data, int index);

/*
** Permet de supprimer l'élément en fin de liste.
**
** \param list La liste où enlever l'élément.
*/
void List_PopBack(List *list);

/*
** Permet de supprimer l'élément en tête de liste.
**
** \param list La liste où enlever l'élément.
*/
void List_PopUp(List *list);

/*
** Permet de supprimer un élément.
**
** \param list La liste où supprimer l'élément.
** \param index L'index de l'élément à enlever. Les autres éléments
** seront raprochés si nécessaire. L'index commence à 0.
*/
void List_Delete(List *list, int index);

/*
** Permet de connaitre la taille de la liste.
**
** \param list La liste à mesurer.
** \return Le nombre d'élément contenu dans la liste
*/
int List_Size(List list);

/*
** Permet de vider la liste de ses éléments.
**
** \param list La liste à vider.
*/
void List_Clear(List *list);

/*
** Permet de récupérer un élément.
**
** \param list La liste où chercher l'élément.
** \param index L'index où chercher l'élément.
** \return La valeur de l'élément.
*/
int List_Get(List list, int index);

/*
** Permet d'initialiser un élément de la liste
**
** \param list La liste où initialiser l'élément
** \param data La nouvelle valeur de l'élément
** \param index L'index de l'élément
*/
void List_Set(List *list, int data, int index);

#endif /*ifndef TYPES_LIST_HEADER*/
